package com.yyh.io2;

import java.io.*;

/*4.复制文件夹d:/huayujava下面所有文件和子文件夹内容到d:/huayujava2。
提示：涉及单个文件复制、目录的创建、递归的使用*/
public class Test44 {
    public static void main(String[] args) throws FileNotFoundException {
        File srcFile = new File("D:\\course\\02-JavaSE进阶\\day10-IO流\\代码");
        File destFile = new File("D:\\course\\02-JavaSE进阶\\day10-IO流\\代码2");
        Test44.copyDirectory(srcFile, destFile);


        for (int i = 1; i <= 100; i++) {
            System.out.println(i);
        }
    }

    /*
        将 C:\Users\lenovo\IdeaProjects\javase-code\day09-code\src\com\xiangge 中所有的后代文件和文件夹拷贝到 C:\Users\lenovo\IdeaProjects\javase-code\day09-code\src\com\test
     */

    public static void copyDirectory(File src, File dest) throws FileNotFoundException {
        if (!src.exists()) {
            throw new RuntimeException("源文件不存在");
        }
        if (!dest.exists()) {
            dest.mkdirs();
        }
        if (!src.isDirectory() || !dest.isDirectory()) {
            throw new IllegalArgumentException("源文件不是文件夹或者目标文件不是文件夹");
        }

        // 拼凑目标文件对象
        File destFile = new File(dest, src.getName()); // destFile = D:\a\b\test
        if (!destFile.exists()){
            destFile.mkdirs();
        }

        // 获取源文件下的所有子文件子文件夹对象
        File[] files = src.listFiles();
        for (File zifile : files) { // copy
            // 判断zifile是文件还是文件夹
            if (zifile.isFile()) {
                copyFile(zifile, destFile);
            }
            else{// zifile是文件夹
                // 拼凑目标文件对象
                File destFile2 = new File(destFile, zifile.getName()); // D:\a\b\test\copy
                if (!destFile2.exists()){
                    destFile2.mkdirs();
                }
                // 递归调用copyDirectory方法
                copyDirectory(zifile, destFile2);
            }
        }

    }

    // 拷贝文件的方法 : C:\Users\lenovo\IdeaProjects\javase-code\day09-code\src\com\xiangge\properties\jdbc.properties   ----> C:\Users\lenovo\IdeaProjects\javase-code\day09-code\src\com\test\jdbc.properties
    public static void copyFile(File src, File dest) throws FileNotFoundException {
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
        /*
            这里的src 是源文件 对象 ---->  C:\Users\lenovo\IdeaProjects\javase-code\day09-code\src\com\xiangge\properties\jdbc.properties
            dest 是目标文件对象 ---->  C:\Users\lenovo\IdeaProjects\javase-code\day09-code\src\com\test\jdbc.properties
         */

            // 1. 校验
            if (!src.exists()) { // 判断源文件是否存在并且是文件
                throw new FileNotFoundException("源文件不存在");
            }
            if (!src.isFile() || !dest.isDirectory()){
                throw new IllegalArgumentException("源文件不是文件或者目标文件不是文件夹");
            }

            if (!dest.exists()){
                dest.mkdirs();
            }

            // 拼凑目标文件对象
            File destfile = new File(dest, src.getName());

            // 2. 创建流管道
            fis = new FileInputStream(src);
            fos = new FileOutputStream(destfile);

            // 3. 开水龙头：开始读，写
            byte[] car = new byte[1024];
            int len;
            while ((len = fis.read(car)) != -1){
                fos.write(car, 0, len);
            }


        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 4. 关水龙头：关流
            try {
                if (fos != null) {
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }
}
